package com.cskaoyan.processor;

import com.cskaoyan.lifecycle.LifeCycleBean;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;

import javax.sql.DataSource;

/**
 * @author stone
 * @date 2021/12/27 11:23
 */
public class CustomBeanPostProcessor implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("组件" + beanName +"的BeanPostProcessor的before方法");

        // Spring针对于这个返回值做了处理：
        //      如果返回值为null,注册的就是原先的值，相当于return bean
        //      如果返回值不为null,注册到容器中的就是你提供的返回值

        //针对于容器中的某一类或某一个组件可以在这里做通用性的处理
        // 能否找到所有的DataSource组件做处理
        if (bean instanceof DataSource) {
            //个性化的处理
            // 数据库的密码是123456
            // 我这里可以获得配置文件中的abcdef
            // 把abcdef转换为你需要的123456
        }
        // 我能否找到lifeCycleBean这个组件
        if ("lifeCycleBean".equals(beanName)) {
            //原先的username是songge → 组件到达可用状态之前变成ligenli
            LifeCycleBean temp = (LifeCycleBean) bean;
            temp.setUsername("ligenli");
            return temp;
        }
        // 传入的是委托类的实例，返回的是代理对象
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("组件" + beanName +"的BeanPostProcessor的after方法");
        return null;
    }
}
